package Contas

import java.awt.Image 
import javax.swing.ImageIcon 

class AdministradorController {

    static usuarioResult
    static adminResult

    static String ddd = "";
    static String telefoneParte1 = "";
    static String telefoneParte2 = "";
	static consulta
	
    def authenticateService
    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
    def tiposAdmin = TipoAdministrador.executeQuery("select tipo from TipoAdministrador")
	def tiposProjeto = Projeto.executeQuery("select nome from Projeto")
	def tiposUsuario = TipoUsuario.executeQuery("select tipo from TipoUsuario")

	def datateste = new Date()
	
	
    def index = {
	    redirect(action: "list", params: params)
    }
	
	static send = {
		sendMail {
			to "natexcientista@gmail.com"
			subject "SPL - Emprestimo em atraso."
			body 'Caro usuario, seu emprestimo est� atrasado. Por favor, atualize-o.'
		}
		render "Email Send!!"
	}
	
    def list = {
        params.max = Math.min(params.max ? params.int('max') : 10, 100)
        [administradorInstanceList: Administrador.list(params), administradorInstanceTotal: Administrador.count(), ddd:ddd, telefoneParte1:telefoneParte1, telefoneParte2:telefoneParte2]
    }

    def create = {     
       [person: new Administrador(params), authorityList: Permissao.list(), tiposAdmin:tiposAdmin, tiposProjeto:tiposProjeto]
    }
	
    private void addRoles(person) {
        Permissao.findByAuthority("ROLE_ADMIN").addToPeople(person)
    }

    def save = {
        def person = new Administrador()

        person.properties = params
		
        if (params.tipo[0].toString().equals("Novo Tipo")){
            def novoTipo = new TipoAdministrador(tipo: params.tipo[1].toString())
			 
            if (novoTipo.save()){
                person.properties.tipo = params.tipo[1].toString()
            }else{
                person.properties.tipo = ''
            }
			
        }else {
            person.properties.tipo = params.tipo[0].toString()
        }
		
		def telefoneInstance = new Telefone()
		
		telefoneInstance.ddd = params.ddd
		telefoneInstance.telefoneParte1 = params.telefoneParte1
		telefoneInstance.telefoneParte2 = params.telefoneParte2
		person.telefone = telefoneInstance.toString()
		
		if (!Telefone.isNumb(person.telefone) || !(person.telefone.length() == 10)){
			telefoneInstance.ddd =''
			telefoneInstance.telefoneParte1 =''
			telefoneInstance.telefoneParte2 = ''
		}
	
		
		if (person.save()) {
			try {
				sendMail {
							to ""+person.email+""
							subject "SPL - Usuario Cadastrado"
							body 'Caro '+ person.userRealName + ', voce foi cadastrado no Sistema SPL como administrador. Bom Uso!'
				}
			} catch (Exception error){
				
			}
			telefoneInstance.save()
			if (telefoneInstance.id != null){
				person.telefoneId = telefoneInstance.id
			}
			person.passwd = authenticateService.encodePassword(params.passwd)
			addRoles(person)
                        flash.message = "${message(code: 'default.created.message', args: [message(code: 'administrador.label', default: 'Administrador'), person.id])}"
                        redirect(action: "show", id: person.id)
                }
		else {
                        person.passwd = '' 
			render view: 'create', model: [authorityList: Permissao.list(), administradorInstance: person, tiposAdmin:tiposAdmin, telefoneInstance:telefoneInstance]
		}
    }

    def show = {
        def administradorInstance = Administrador.get(params.id)
		def telefone = Telefone.get(administradorInstance.telefoneId) 
		
        if (!administradorInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'administrador.label', default: 'Administrador'), params.id])}"
            redirect(action: "list")
        }
        else {
			if (telefone !=null){
				[administradorInstance: administradorInstance, telefone:telefone.formatFone()]
			}else{
				[administradorInstance: administradorInstance, telefone:telefone]
			}
			
            
        }
    }

    def edit = {
        def administradorInstance = Administrador.get(params.id)
		def telefoneInstance = Telefone.get(administradorInstance.telefoneId)
        if (!administradorInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'administrador.label', default: 'Administrador'), params.id])}"
            redirect(action: "list")
        }
        else {
            return [administradorInstance: administradorInstance, tiposAdmin:tiposAdmin, tiposProjeto:tiposProjeto, telefoneInstance: telefoneInstance]
        }
    }

    def update = {
        def administradorInstance = Administrador.get(params.id)
		def telefoneInstance = Telefone.get(administradorInstance.telefoneId)
	
		
		if (authenticateService.encodePassword(administradorInstance.passwd) != authenticateService.encodePassword(params.senha)){
		
			administradorInstance.passwd = authenticateService.encodePassword(params.senha)
		}
        if (params.tipo[0].toString().equals("Novo Tipo")){
            def novoTipo = new TipoAdministrador(tipo: params.tipo[1].toString())
			
            if (novoTipo.save()){
                params.tipo = novoTipo.tipo.toString()
            }else{
                params.tipo = ''
            }
		   
        }else {
            params.tipo = params.tipo[0].toString()
        }
		if (telefoneInstance!=null){
			telefoneInstance.ddd = params.ddd
			telefoneInstance.telefoneParte1 = params.telefoneParte1
			telefoneInstance.telefoneParte2 = params.telefoneParte2
			administradorInstance.telefone = telefoneInstance.toString()
		}
		if (!Telefone.isNumb(administradorInstance.telefone) || !administradorInstance.telefone.length() == 10){
			telefoneInstance.ddd =''
			telefoneInstance.telefoneParte1 =''
			telefoneInstance.telefoneParte2 = ''
		}

		
        if (administradorInstance) {
            if (params.version) {
                def version = params.version.toLong()
                if (administradorInstance.version > version) {
                    
                    administradorInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'administrador.label', default: 'Administrador')] as Object[], "Another user has updated this Administrador while you were editing")
                    render(view: "edit", model: [administradorInstance: administradorInstance, telefoneInstance:telefoneInstance, tiposAdmin:tiposAdmin])
                    return
                }
            }
            administradorInstance.properties = params
            if (!administradorInstance.hasErrors() && administradorInstance.save(flush: true)) {
                flash.message = "${message(code: 'default.updated.message', args: [message(code: 'administrador.label', default: 'Administrador'), params.id])}"
                redirect(action: "show", id: administradorInstance.id)
            }
            else {
                render(view: "edit", model: [administradorInstance: administradorInstance, telefoneInstance:telefoneInstance, tiposAdmin:tiposAdmin])
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'administrador.label', default: 'Administrador'), params.id])}"
            redirect(action: "list")
        }
    }

    def delete = {
        
        def person = Administrador.get(params.id)
        if (person) {
            def authPrincipal = authenticateService.principal()
            //avoid self-delete if the logged-in user is an admin
            if (!(authPrincipal instanceof String) && authPrincipal.username == person.username) {
                flash.message = "You can not delete yourself, please login as another admin and try again"
            }
            else {
                //first, delete this person from People_Authorities table.
                Permissao.findAll().each { it.removeFromPeople(person) }
                person.delete()
                flash.message = "Usuario $params.id deleted."
            }
        }
        else {
            flash.message = "Usuario not found with id $params.id"
        }

        redirect action: list
    }
    def search_admin = {
		[tiposAdmin:tiposAdmin]
	}
    
	def search_usuario = {		
		[tiposUsuario:tiposUsuario, tiposProjeto:tiposProjeto]
	}
	
    def search = {}
	
    def results = {
        if (!params.max) params.max = 50
        if (!params.offset) params.offset = 0
        if (!params.sort) params.sort = "userRealName"
        if (!params.order) params.order = "asc"
		
		consulta = params;
		println(consulta);

        def tipo = 'false'
        def criteriaUsuario = UsuarioComum.createCriteria()
        def criteriaAdmin = Administrador.createCriteria()
		
        adminResult = criteriaAdmin {
            if(!params.sort == "projeto"){
                maxResults(params.max?.toInteger())
                firstResult(params.offset?.toInteger())
                order(params.sort, params.order)
            }
            and{ like('userRealName','%' + params.name + '%') }
        }
		
        usuarioResult = criteriaUsuario {
            maxResults(params.max?.toInteger())
            firstResult(params.offset?.toInteger())
            order(params.sort, params.order)
            and{ like('userRealName','%' + params.name + '%') }
        }
		
		
        [pesquisaUsuario: usuarioResult, pesquisaAdmin: adminResult,type : tipo , params : params]
    }
  
	
    def results_admin = {
        if (!params.max) params.max = 50
        if (!params.offset) params.offset = 0
        if (!params.sort) params.sort = "userRealName"
        if (!params.order) params.order = "asc"
		
		consulta = params;
		println(consulta);
		
        def criteria = Administrador.createCriteria()  
		def telefone = params.ddd + params.telefoneParte1 + params.telefoneParte2
		
        adminResult = criteria {
            maxResults(params.max?.toInteger())
            firstResult(params.offset?.toInteger())
            order(params.sort, params.order)
            and{
			like('username','%' + params.username + '%')
            like('email','%' + params.email + '%')
			like('telefone','%' + telefone + '%')
            like('userRealName','%' + params.name + '%')
			
			if(params.tipo != ' '){
				like('tipo', '%' + params.tipo + '%')
			}
			
			}
        }
        [pesquisaAdmin: adminResult, params : params]
    }
	
    def results_usuario = {
        if (!params.max) params.max = 50
        if (!params.offset) params.offset = 0
        if (!params.sort) params.sort = "userRealName"
        if (!params.order) params.order = "asc"		
		
		consulta = params;
		println(consulta);
		
		def telefone = params.ddd + params.telefoneParte1 + params.telefoneParte2
		
		def criteria = UsuarioComum.createCriteria()
		
		usuarioResult = criteria {
			maxResults(params.max?.toInteger())
			firstResult(params.offset?.toInteger())
			order(params.sort, params.order)
			and{
					like('username','%' + params.username + '%')
					like('email','%' + params.email + '%')
					
					like('telefone','%' + telefone + '%')										
					
					like('userRealName','%' + params.name + '%')
					
					if(params.projeto != ' '){
						like('projeto', '%' + params.projeto + '%')
					}
					if(params.tipo != ' '){
						like('tipo', '%' + params.tipo + '%')
					}										
					if(params.anoIngresso != ' '){
						like('anoIngresso', '%' + params.anoIngresso + '%')
					}										
			}
		}

		[pesquisaUsuario: usuarioResult, params : params]
	}

	
   def createReportAdminSimple = {
        def administradores = adminResult					
		
		String caminhoLogoSPL = System.getProperty("user.dir") + "\\web-app\\reports\\logo_spl_report.jpg";
		String caminhoLogoGMF = System.getProperty("user.dir") + "\\web-app\\reports\\gmf.jpg";
		
		params.put("logoSPL", caminhoLogoSPL);			
		params.put("logoGMF", caminhoLogoGMF);
		params.put("loginConsulta", consulta.name)	
		
        chain(controller:'jasper',action:'index',model:[data:administradores],params:params)
    }
	
	def createReportAdminComplete = {
		def administradores = adminResult
		
		String caminhoLogoSPL = System.getProperty("user.dir") + "\\web-app\\reports\\logo_spl_report.jpg";
		String caminhoLogoGMF = System.getProperty("user.dir") + "\\web-app\\reports\\gmf.jpg";
		
		params.put("logoSPL", caminhoLogoSPL);
		params.put("logoGMF", caminhoLogoGMF);
		params.put("loginConsulta", consulta.username)
				
		String telefone = ''
		
		if(consulta.ddd){
			telefone = '(' + ddd + ') '
		}
		if(consulta.telefoneParte1){
			telefone += telefoneParte1
		}
		if(consulta.telefoneParte2){
			telefone += ' - ' + telefoneParte2
		}
		
		
		params.put("telefoneConsulta", telefone)
		
		params.put("emailConsulta", consulta.email)
		
		if(consulta.tipo){
			params.put("tipoConsulta", consulta.tipo)
		} else {
			params.put("tipoConsulta", "")
		}
		
		params.put("nomeConsulta", consulta.name)
		
		chain(controller:'jasper',action:'index',model:[data:administradores],params:params)
	}


    def createReportUsuarioSimple = {
        def usuarios = usuarioResult
		
		String caminhoLogoSPL = System.getProperty("user.dir") + "\\web-app\\reports\\logo_spl_report.jpg";
		String caminhoLogoGMF = System.getProperty("user.dir") + "\\web-app\\reports\\gmf.jpg";
				
		params.put("logoSPL", caminhoLogoSPL);
		params.put("logoGMF", caminhoLogoGMF);
		params.put("loginConsulta", consulta.name);
		
        chain(controller:'jasper',action:'index',model:[data:usuarios],params:params)
    }

	
	def createReportUsuarioComplete = {
		def usuarios = usuarioResult
		
		String caminhoLogoSPL = System.getProperty("user.dir") + "\\web-app\\reports\\logo_spl_report.jpg";
		String caminhoLogoGMF = System.getProperty("user.dir") + "\\web-app\\reports\\gmf.jpg";
				
		params.put("logoSPL", caminhoLogoSPL);
		params.put("logoGMF", caminhoLogoGMF);
		params.put("loginConsulta", consulta.username)
		
		println(consulta)
		
		String telefone = ''
		
		if(consulta.ddd){
			telefone = '(' + ddd + ') '
		}
		if(consulta.telefoneParte1){
			telefone += telefoneParte1
		}
		if(consulta.telefoneParte2){
			telefone += ' - ' + telefoneParte2
		}

		params.put("telefoneConsulta", telefone)
		
		params.put("emailConsulta", consulta.email)
		
		if(consulta.tipo){
			params.put("tipoConsulta", consulta.tipo)
		} else {
			params.put("tipoConsulta", "")
		}
		
		if(consulta.projeto){
			params.put("projetoConsulta", consulta.projeto)
		} else {
			params.put("projetoConsulta", "")
		}
		
		if(consulta.anoIngresso){
			params.put("anoIngressoConsulta", consulta.anoIngresso)
		} else {
			params.put("anoIngressoConsulta", "")
		}
		
		params.put("nomeConsulta", consulta.name)
		
		chain(controller:'jasper',action:'index',model:[data:usuarios],params:params)
	}

}
